package com.szholly.pro.watergas_server.ps.service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.szholly.pro.watergas_server.common.data.DataUtil;
import com.szholly.utils.util.StringUtils;
import com.szholly.data.general.GlobalParameter;
import com.szholly.data.general.RowBase;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * 运营数据有效性判断
 * @author wangl
 *
 * 2016年6月3日
 */
@Service
public class OperationDataVaildService {
	private static final Logger LOGGER = LoggerFactory.getLogger(OperationDataVaildService.class);
	
	/**
	 * 判断日常巡检数据是否有效
	 */
	public void IsInspection(String rows){
		if (StringUtils.IsNullOrSpace(rows)) {
			return ;
		}
		//任务id
		String task_code="";
		//时间
		String tm="";
		//存储数据是否有效
		String is_valid="";
		HashMap<String, String> map=new HashMap<String, String>();
		//任务类型,1为日常巡检,2为定期维护，3为超标比对，4为设备故障维修，5为备件及耗材更换，6为水样比对，7为标样核查，8为日常校准
		map.put("TASK_TYPE", "1");
		//0-污染源  1-地表水 2-工业污染源 3-供水
		map.put("DATA_TYPE", "0");
		//获取其中一条数据中的任务ID和日期
		JSONArray jsonArray = JSONArray.fromObject(rows);
		if (jsonArray.size() > 0) {
			JSONObject rowItem = jsonArray.getJSONObject(0);
			task_code=rowItem.getString("TASK_CODE");
			tm=rowItem.getString("CREATE_ON");
			map.put("TASK_CODE", task_code);
			map.put("CT", tm);
		}
		//1、先判断数据是否有效,如果包含0则数据无效,直接保存返回
		is_valid="1";
		/*for(int i=0;i<jsonArray.size();i++){
			JSONObject rowItem = jsonArray.getJSONObject(i);
			if(rowItem.getString("ITEM_VALUE").equals("0")||rowItem.getString("ITEM_VALUE").equals("2")){
				is_valid="0";
				//map.put("IS_VALID", "0");
				//saveEffectivenessData(map);
				//return;
			}
			else{
				is_valid="1";
			}
		}*/
			//2、再判断是否超时
			//2.1 先查询容限时间
			Map<String,String> toleranceMap=new HashMap<String,String>();
			toleranceMap=getToleranceData("fa3ecf1a-4820-4f9f-b7b7-2553584ee7ba",task_code);
			toleranceMap.put("fish_time", tm);
			//2.2判断是否超时
			String str=IsTimeOut(toleranceMap);
			if(is_valid.equals("1")){
				map.put("IS_VALID", str);
			}
			else{
				map.put("IS_VALID", is_valid);
			}
			map.put("IS_TIMEOUT", str);
			saveEffectivenessData(map);
	}
	/**
	 * 判断定期维护数据是否有效
	 */
	public void IsMaintainance(String rows){
		if (StringUtils.IsNullOrSpace(rows)) {
			return ;
		}
		//任务id
		String task_code="";
		//时间
		String tm="";
		HashMap<String, String> map=new HashMap<String, String>();
		//任务类型,1为日常巡检,2为定期维护，3为超标比对，4为设备故障维修，5为备件及耗材更换，6为水样比对，7为标样核查，8为日常校准
		map.put("TASK_TYPE", "2");
		//0-污染源  1-地表水 2-工业污染源 3-供水
		map.put("DATA_TYPE", "0");
		//存储数据是否有效
		String is_valid="";
		//获取其中一条数据中的任务ID和日期
		JSONArray jsonArray = JSONArray.fromObject(rows);
		if (jsonArray.size() > 0) {
			JSONObject rowItem = jsonArray.getJSONObject(0);
			task_code=rowItem.getString("TASK_CODE");
			tm=rowItem.getString("CREATE_ON");
			map.put("TASK_CODE", task_code);
			map.put("CT", tm);
		}
		//1、先判断数据是否有效,如果包含0则数据无效,直接保存返回
		is_valid="1";
		/*for(int i=0;i<jsonArray.size();i++){
			JSONObject rowItem = jsonArray.getJSONObject(i);
			if(rowItem.getString("ITEM_VALUE").equals("0")){
				//map.put("IS_VALID", "0");
				is_valid="0";
				//saveEffectivenessData(map);
				//return;
			}
			else{
				is_valid="1";
			}
		}*/
			//2、再判断是否超时
			//2.1 先查询容限时间
			Map<String,String> toleranceMap=new HashMap<String,String>();
			toleranceMap=getToleranceData("0bddcd82-73ff-4ee7-85af-491108b7f374",task_code);
			toleranceMap.put("fish_time", tm);
			//2.2判断是否超时
			String str=IsTimeOut(toleranceMap);
			if(is_valid.equals("1")){
				map.put("IS_VALID", str);
			}
			else{
				map.put("IS_VALID", is_valid);
			}
			map.put("IS_TIMEOUT", str);
			saveEffectivenessData(map);
	}

	/**
	 * 判断设备故障及维修数据有效
	 */
	public void IsRepair(String rows){
		if (StringUtils.IsNullOrSpace(rows)) {
			return ;
		}
		//任务id
		String task_code="";
		//时间
		String tm="";
		HashMap<String, String> map=new HashMap<String, String>();
		//任务类型,1为日常巡检,2为定期维护，3为超标比对，4为设备故障维修，5为备件及耗材更换，6为水样比对，7为标样核查，8为日常校准
		map.put("TASK_TYPE", "4");
		//0-污染源  1-地表水 2-工业污染源 3-供水
		map.put("DATA_TYPE", "0");
		//存储数据是否有效
		String is_valid="";
		//获取其中一条数据中的任务ID和日期
		    JSONObject rowItem=JSONObject.fromObject(rows);
			task_code=rowItem.getString("TASK_ID");
			tm=rowItem.getString("END_TIME");
			map.put("TASK_CODE", task_code);
			map.put("CT", tm);
		    //先判断数据是否修复
			if(rowItem.getString("REPAIR_RESULT").equals("0")){
				is_valid="0";
				//map.put("IS_VALID", "0");
				//saveEffectivenessData(map);
			}
			else{
				is_valid="1";
				
			}
			//2、再判断是否超时
			//2.1 先查询容限时间
			Map<String,String> toleranceMap=new HashMap<String,String>();
			toleranceMap=getToleranceData("5ed321b7-99ca-4f0b-b81f-008475d0174a",task_code);
			toleranceMap.put("fish_time", tm);
			//1.2判断是否超时
			String str=IsTimeOut(toleranceMap);
			if(is_valid.equals("1")){
				map.put("IS_VALID", str);
			}
			else{
				map.put("IS_VALID", is_valid);
			}
			map.put("IS_TIMEOUT", str);
			saveEffectivenessData(map);
	}
	/**
	 * 耗材/备件更换
	 */
	public void IsReplace(String rows){
		if (StringUtils.IsNullOrSpace(rows)) {
			return ;
		}
		//任务id
		String task_code="";
		//时间
		String tm="";
		HashMap<String, String> map=new HashMap<String, String>();
		//任务类型,1为日常巡检,2为定期维护，3为超标比对，4为设备故障维修，5为备件及耗材更换，6为水样比对，7为标样核查，8为日常校准
		map.put("TASK_TYPE", "5");
		//0-污染源  1-地表水 2-工业污染源 3-供水
		map.put("DATA_TYPE", "0");
		//获取其中一条数据中的任务ID和日期
		JSONArray jsonArray = JSONArray.fromObject(rows);
		if (jsonArray.size() > 0) {
			JSONObject rowItem = jsonArray.getJSONObject(0);
			task_code=rowItem.getString("TASK_ID");
			tm=rowItem.getString("REPLACE_DATE");
			map.put("TASK_CODE", task_code);
			map.put("CT", tm);
		}
			
			//1 先查询容限时间
			Map<String,String> toleranceMap=new HashMap<String,String>();
			toleranceMap=getToleranceData("5ed321b7-99ca-4f0b-b81f-008475d0174a",task_code);
			toleranceMap.put("fish_time", tm);
			//2判断是否超时
			String str=IsTimeOut(toleranceMap);
			map.put("IS_VALID", str);
			map.put("IS_TIMEOUT", str);
			saveEffectivenessData(map);
	}
	/**
	 * 日常校准
	 */
	public void IsVerification(String rows){
		if (StringUtils.IsNullOrSpace(rows)) {
			return ;
		}
		//任务id
		String task_code="";
		//时间
		String tm="";
		HashMap<String, String> map=new HashMap<String, String>();
		//任务类型,1为日常巡检,2为定期维护，3为超标比对，4为设备故障维修，5为备件及耗材更换，6为水样比对，7为标样核查，8为日常校准
		map.put("TASK_TYPE", "8");
		//0-污染源  1-地表水 2-工业污染源 3-供水
		map.put("DATA_TYPE", "0");
		//获取其中一条数据中的任务ID和日期
		JSONArray jsonArray = JSONArray.fromObject(rows);
		//存储数据是否有效
		 String is_valid="";
		if (jsonArray.size() > 0) {
			JSONObject rowItem = jsonArray.getJSONObject(0);
			task_code=rowItem.getString("TASK_CODE");
			tm=rowItem.getString("VERIFY_DATE");
			map.put("TASK_CODE", task_code);
			map.put("CT", tm);
		}
			//1、判断是否超时
			//1.1 先查询容限时间
			Map<String,String> toleranceMap=new HashMap<String,String>();
			toleranceMap=getToleranceData("5385ab20-26ee-4fd0-a419-1cd9174a9921",task_code);
			toleranceMap.put("fish_time", tm);
			//1.2判断是否超时
			String str=IsTimeOut(toleranceMap);
			is_valid=str;
			for(int i=0;i<jsonArray.size();i++){
				JSONObject rowItem = jsonArray.getJSONObject(i);
				if(rowItem.getString("VERIFY_RESULT").equals("0")||is_valid.equals("0")){
					is_valid="0";
					
				}
				else{
					is_valid="1";
				}
				map.put("IS_TIMEOUT", str);
				map.put("IS_VALID", is_valid);
			}
			saveEffectivenessData(map);
	}
	/**
	 * 超标比对
	 */
	public void IsComparison(String rows){
		if (StringUtils.IsNullOrSpace(rows)) {
			return ;
		}
		//任务id
		String task_code="";
		//时间
		String tm="";
		HashMap<String, String> map=new HashMap<String, String>();
		//任务类型,1为日常巡检,2为定期维护，3为超标比对，4为设备故障维修，5为备件及耗材更换，6为水样比对，7为标样核查，8为日常校准
		map.put("TASK_TYPE", "3");
		//0-污染源  1-地表水 2-工业污染源 3-供水
		map.put("DATA_TYPE", "0");
		//获取其中一条数据中的任务ID和日期
		JSONArray jsonArray = JSONArray.fromObject(rows);
		//存储数据是否有效
		 String is_valid="";
		if (jsonArray.size() > 0) {
			JSONObject rowItem = jsonArray.getJSONObject(0);
			task_code=rowItem.getString("TASK_ID");
			tm=rowItem.getString("MEASURE_END_TIME");
			map.put("TASK_CODE", task_code);
			map.put("CT", tm);
		}
			//1、判断是否超时
			//1.1 先查询容限时间
			Map<String,String> toleranceMap=new HashMap<String,String>();
			toleranceMap=getToleranceData("2bf6c8b1-12c3-496c-8e1b-96b52157e12c",task_code);
			toleranceMap.put("fish_time", tm);
			//1.2判断是否超时
			String str=IsTimeOut(toleranceMap);
			is_valid=str;
			String str1="";
			String str2="";
			String str3="";
			str1=jsonArray.getJSONObject(0).getString("MEASURE_CONCLUSION");
			str2=jsonArray.getJSONObject(1).getString("MEASURE_CONCLUSION");
			str3=jsonArray.getJSONObject(2).getString("MEASURE_CONCLUSION");
			if(is_valid.equals("1")){
				if((str1.equals("1")&&str2.equals("1"))||(str1.equals("1")&&str3.equals("1"))||(str2.equals("1")&&str3.equals("1"))){
					is_valid="1";
				}
				else{
					is_valid="0";
				}
			}
			else{
				is_valid="0";
			}
			map.put("IS_TIMEOUT", str);
			map.put("IS_VALID", is_valid);
			saveEffectivenessData(map);
	}
	/**
	 * 水样比对
	 */
	public void IsSampleComparison(String rows){
		if (StringUtils.IsNullOrSpace(rows)) {
			return ;
		}
		//任务id
		String task_code="";
		//时间
		String tm="";
		HashMap<String, String> map=new HashMap<String, String>();
		//任务类型,1为日常巡检,2为定期维护，3为超标比对，4为设备故障维修，5为备件及耗材更换，6为水样比对，7为标样核查，8为日常校准
		map.put("TASK_TYPE", "6");
		//0-污染源  1-地表水 2-工业污染源 3-供水
		map.put("DATA_TYPE", "0");
		//获取其中一条数据中的任务ID和日期
		JSONArray jsonArray = JSONArray.fromObject(rows);
		//存储数据是否有效
		 String is_valid="";
		if (jsonArray.size() > 0) {
			JSONObject rowItem = jsonArray.getJSONObject(0);
			task_code=rowItem.getString("TASK_ID");
			tm=rowItem.getString("MEASURE_END_TIME");
			map.put("TASK_CODE", task_code);
			map.put("CT", tm);
		}
			//1、判断是否超时
			//1.1 先查询容限时间
			Map<String,String> toleranceMap=new HashMap<String,String>();
			toleranceMap=getToleranceData("0f9faa25-89e4-4ad6-869f-aa1beb70f7bc",task_code);
			toleranceMap.put("fish_time", tm);
			//1.2判断是否超时
			String str=IsTimeOut(toleranceMap);
			is_valid=str;
			String str1="";
			String str2="";
			String str3="";
			str1=jsonArray.getJSONObject(0).getString("MEASURE_CONCLUSION");
			str2=jsonArray.getJSONObject(1).getString("MEASURE_CONCLUSION");
			str3=jsonArray.getJSONObject(2).getString("MEASURE_CONCLUSION");
			if(is_valid.equals("1")){
				if((str1.equals("1")&&str2.equals("1"))||(str1.equals("1")&&str3.equals("1"))||(str2.equals("1")&&str3.equals("1"))){
					is_valid="1";
				}
				else{
					is_valid="0";
				}
			}
			else{
				is_valid="0";
			}
			map.put("IS_TIMEOUT", str);
			map.put("IS_VALID", is_valid);
			saveEffectivenessData(map);
	}
	/**
	 * 标样核查
	 */
	public void IsStandVerification(String rows){
		if (StringUtils.IsNullOrSpace(rows)) {
			return ;
		}
		//任务id
		String task_code="";
		//时间
		String tm="";
		HashMap<String, String> map=new HashMap<String, String>();
		//任务类型,1为日常巡检,2为定期维护，3为超标比对，4为设备故障维修，5为备件及耗材更换，6为水样比对，7为标样核查，8为日常校准
		map.put("TASK_TYPE", "7");
		//0-污染源  1-地表水 2-工业污染源 3-供水
		map.put("DATA_TYPE", "0");
		//获取其中一条数据中的任务ID和日期
		JSONArray jsonArray = JSONArray.fromObject(rows);
		//存储数据是否有效
		 String is_valid="";
		if (jsonArray.size() > 0) {
			JSONObject rowItem = jsonArray.getJSONObject(0);
			task_code=rowItem.getString("TASK_CODE");
			tm=rowItem.getString("END_TIME");
			map.put("TASK_CODE", task_code);
			map.put("CT", tm);
		}
			//1、判断是否超时
			//1.1 先查询容限时间
			Map<String,String> toleranceMap=new HashMap<String,String>();
			toleranceMap=getToleranceData("21c74765-685e-4a89-a625-0fa8f3668fc5",task_code);
			toleranceMap.put("fish_time", tm);
			//1.2判断是否超时
			String str=IsTimeOut(toleranceMap);
			is_valid=str;
			String str1="";
			String str2="";
			str1=jsonArray.getJSONObject(0).getString("CONCLUSION");
			str2=jsonArray.getJSONObject(1).getString("CONCLUSION");
			if(str1.equals("1")&&str2.equals("1")&&is_valid.equals("1")){
				is_valid="1";
			}
			else{
				is_valid="0";
			}
			map.put("IS_TIMEOUT", str);
			map.put("IS_VALID", is_valid);
			saveEffectivenessData(map);
	}
	
	/**
	 * 保存运维数据
	 * @param map
	 */
	public void saveEffectivenessData(HashMap<String, String> map){
		String sql="insert into OP_EFFE(GUID,TASK_CODE,IS_VALID,TASK_TYPE,CT,DATA_TYPE,IS_TIMEOUT)values(@GUID,@TASK_CODE,@IS_VALID,@TASK_TYPE,@CT,@DATA_TYPE,@IS_TIMEOUT)";
		List<GlobalParameter> parms = new ArrayList<GlobalParameter>();
		String GUID = UUID.randomUUID().toString();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
		parms.clear();
	    Date ct;
		try {
			ct = sdf.parse(map.get("CT").toString());
			parms.add(new GlobalParameter("CT", ct));
		} catch (ParseException e) {
			e.printStackTrace();
		} 
		parms.add(new GlobalParameter("GUID", GUID));
		parms.add(new GlobalParameter("TASK_CODE", map.get("TASK_CODE")));
		parms.add(new GlobalParameter("IS_VALID", map.get("IS_VALID")));
		parms.add(new GlobalParameter("TASK_TYPE", map.get("TASK_TYPE")));
		parms.add(new GlobalParameter("DATA_TYPE", map.get("DATA_TYPE")));
		parms.add(new GlobalParameter("IS_TIMEOUT", map.get("IS_TIMEOUT")));
		DataUtil.ExecuteUpdateSql(sql, parms);
		LOGGER.info("安卓端保存运营数据成功!");
	}
	
	/**
	 * 获取任务容限值和周期和截止日期
	 * @param jobId
	 * @param task_code
	 * @return
	 */
	public Map<String,String> getToleranceData(String jobId,String task_code){
		List<GlobalParameter> parms = new ArrayList<GlobalParameter>();
		String sql="select t2.end_time,t1.task_cycle,t1.task_tolerance from OC_TASK_CONFIG t1 left join operation_task t2 on t1.station_id=t2.station_id where 1=1 and rownum=1 ";
		Map<String,String> map=new HashMap<String,String>();
		if (jobId != null && !jobId.equals("")) {
			sql += " and t1.job_id =@jobId";
			parms.add(new GlobalParameter("jobId", jobId));
		}
		if (task_code != null && !task_code.equals("")) {
			sql += " and t2.task_code =@task_code";
			parms.add(new GlobalParameter("task_code", task_code));
		}
		List<RowBase> rows = DataUtil.getSelectRows(sql, parms);
		if(rows.size()>0){
			RowBase row=rows.get(0);
			map.put("cycle", row.getSafeString("TASK_CYCLE"));
			map.put("tolerance", row.getSafeString("TASK_TOLERANCE"));
			map.put("end_time", row.getSafeString("END_TIME"));
		}
		return  map;
	}
	/**
	 * 判断超时，返回0表示数据超时无效，1为未超时有效
	 * @param map
	 * @return
	 */
	public String IsTimeOut(Map<String,String> map){
		//String tolerance=map.get("tolerance");
		String end_time=map.get("end_time");
		String fish_time=map.get("fish_time");
		String str="0";
		Calendar deathCal = Calendar.getInstance();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date ct=new Date ();
		try {
			 ct = sdf.parse(fish_time.toString());
		} catch (ParseException e1) {
			e1.printStackTrace();
		}
		Date et_date = new Date();
		//设置截止日期
		try {
			et_date = sdf.parse(end_time);
			deathCal.setTime(et_date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		int timeCycleNum = Integer.parseInt(map.get("tolerance").toString().replaceAll("[a-zA-Z]", ""));
		if (map.get("tolerance").toString().indexOf("D") > 0) {
			deathCal.add(Calendar.DAY_OF_MONTH, timeCycleNum);
		} else if (map.get("tolerance").toString().indexOf("M") > 0) {
			deathCal.add(Calendar.MONTH, timeCycleNum);
		}
		//获取到真正截取日期
		Date truefishtime = deathCal.getTime();
		//判断是否超时
		if (truefishtime.getTime() >= ct.getTime()) {
			str="1";
		} else {
			str="0";
		}
		return str;
	}
}
